package com.tarena.lbs.coupon.service.impl;

import com.alibaba.nacos.common.utils.CollectionUtils;
import com.github.pagehelper.PageInfo;
import com.tarena.lbs.coupon.dao.mapper.ActivityMapper;
import com.tarena.lbs.coupon.dao.repository.ActivityRepository;
import com.tarena.lbs.coupon.pojo.param.ActivityAddParam;
import com.tarena.lbs.coupon.pojo.po.ActivityPO;
import com.tarena.lbs.coupon.pojo.query.ActivityPageQuery;
import com.tarena.lbs.coupon.pojo.vo.ActivityVO;
import com.tarena.lbs.coupon.service.ActivityService;
import com.tarena.lbs.attach.api.AttachApi;
import com.tarena.lbs.attach.pojo.dto.AttachDTO;
import com.tarena.lbs.attach.pojo.query.AttachQuery;
import com.tarena.lbs.base.protocol.pager.PageResult;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
public class ActivityServiceImpl implements ActivityService {
    @Resource
    private ActivityMapper activityMapper;
    @Resource
    private ActivityRepository activityRepository;

    @DubboReference(check = false, timeout = 3000, retries = 0)  // 添加容错配置
    private AttachApi attachApi;

    @Override
    public void activitySave(ActivityAddParam param) {
        log.info("活动保存开始");
        // 直接创建 ActivityPO 对象，而不是 Activity 对象
        ActivityPO activityPO = new ActivityPO();
        // 将参数直接复制到 PO 对象
        BeanUtils.copyProperties(param, activityPO);

        // 设置其他属性
        activityPO.setStatus(1);
        activityPO.setStartDate(new Date());
        activityPO.setEndDate(new Date());
        activityPO.setCreateAt(new Date());
        activityPO.setUpdateAt(new Date());
        activityPO.setEnableStatus(1);
        activityPO.setActivityType(1);
        activityPO.setChannelType(1);
        activityPO.setRewardType(1);

        // 直接插入 PO 对象，而不是试图转换为 Collection
        activityMapper.insert(activityPO);
    }


    @Override
    public PageResult<ActivityVO> pageList(ActivityPageQuery query) {
        //1.创建一个新的分页结果对象，用于存储最终的分页查询结果
        PageResult<ActivityVO> voPage = new PageResult<>();
        //total objects pageNo pageSize totalPage
        //2.调用 activityRepository 的 gePages 方法进行分页查询，获取包含活动持久化对象的分页信息
        PageInfo<ActivityPO> pageInfo = activityRepository.pageList(query);
        //pageNo pageSize total
        //3.将分页信息中的页码设置到分页结果对象中
        voPage.setPageNo(pageInfo.getPageNum());
        // 将分页信息中的每页数量设置到分页结果对象中
        voPage.setPageSize(pageInfo.getPageSize());
        // 将分页信息中的总记录数设置到分页结果对象中
        voPage.setTotal(pageInfo.getTotal());
        // 声明一个存储管理员视图对象的列表
        List<ActivityVO> vos = null;
        // 从分页信息中获取管理员持久化对象列表
        List<ActivityPO> activityList= pageInfo.getList();
        // 判断持久化对象列表是否不为空
        if (CollectionUtils.isNotEmpty(activityList)){
            vos = activityList.stream().map(po->{
                ActivityVO vo = new ActivityVO();
                BeanUtils.copyProperties(po,vo);
                return vo;
            }).collect(Collectors.toList());
        }
        voPage.setObjects(vos);
        return voPage;
    }

    @Override
    public ActivityVO activityDetail(Integer id) {
        // 1. 从数据库查询活动基础信息
        ActivityPO activityPO = activityRepository.selectById(id);
        if (activityPO == null) {
            log.warn("未找到ID为{}的活动", id);
            return null;
        }

        // 2. 调用附件服务获取图片信息（添加容错处理）
        List<AttachDTO> attachList = new ArrayList<>();
        if (attachApi != null) {
            try {
                AttachQuery attachQuery = new AttachQuery();
                attachQuery.setActivityId(id); // 添加关联条件
                attachList = attachApi.getAttachInfo(attachQuery);
            } catch (Exception e) {
                log.error("调用附件服务失败，活动ID: {}", id, e);
                // 可以选择返回默认值或记录日志后继续执行
            }
        } else {
            log.warn("AttachApi服务引用为空，活动ID: {}", id);
        }

        // 3. 封装VO对象
        ActivityVO activityVO = null;
        if (activityPO != null) {
            activityVO = new ActivityVO();
            BeanUtils.copyProperties(activityPO, activityVO);
            activityVO.setImgPics(attachList.stream()
                    .map(AttachDTO::getClientFileName)
                    .filter(Objects::nonNull) // 过滤空值
                    .collect(Collectors.toList()));
            }
            return activityVO;
    }

}
